// 策略模式指的是定义一系列算法，把他们一个个封装起来，目的就是将算法的使用和算法的实现分离开来。同时它还可以用来封装一系列的规则，比如常见的表单验证规则，只要这些规则指向的目标一致，并且可以被替换使用，那么就可以用策略模式来封装它们。

// 优点：
// 算法可以自由切换，避免了使用多层条件判断，增加了扩展性

// 缺点：
// 策略类增多，所有策略类都需要对外暴露。

// 例子：
// 表单验证经常无止境的if...else写法，意识到这种写法不靠谱，于是我把检验规则放在一个对象中，在函数中对它进行控制，把规则与实现进行了分离，每次只需要在封装的规则中去修改配置。在后面的多种场景都用这种方法，解决了频繁使用if...else的问题，当第一次接触倒策略模式才知道这种写法也算策略模式。

const rules = {
  cover_img: {
    must: false,
    msg: '请上传封面图片',
    val: '',
  },
  name: {
    must: true,
    msg: '姓名不能为空',
    val: '',
  },
  sex: {
    must: true,
    msg: '请填写性别',
    val: '',
  },
  birthday: {
    must: false,
    msg: '请选择生日',
    val: '',
  },
};
function verify() {
  for (const key in rules) {
    if (rules[key].must && !rules[key].val) {
      console.log(rules[key].msg);
    }
  }
}
verify();
// 姓名不能为空
// 请填写性别
